import os
import pandas as pd
from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt

# 设置CSV文件夹路径
csv_folder = r"C:\Users\einst\Desktop\2023OpenSODA\output"

# 存储所有CSV文件的特征向量
feature_vectors = []

# 遍历CSV文件夹中的文件
for filename in os.listdir(csv_folder):
    if filename.endswith(".csv"):
        # 构建CSV文件的完整路径
        csv_file_path = os.path.join(csv_folder, filename)
        # print(csv_file_path)
        # 读取CSV文件
        df = pd.read_csv(csv_file_path)
        # 处理缺失值或异常值
        df = df.fillna(0)  # 将缺失值填充为0
        df = df.replace([np.inf, -np.inf], 0)  # 将无穷大值替换为0
        # 选择数值类型的列
        df_numeric = df.select_dtypes(include=[np.number])
        # 提取特征向量
        feature_vector = df_numeric.iloc[:, 1:].values  # 假设第一列为仓库名，后续列为时间对应的metric值
        feature_vectors.append(feature_vector)

# 合并特征向量为特征矩阵
X = np.concatenate(feature_vectors, axis=1)

# # ========================   肘部法则得到k=2或者3   =======================
# # 计算聚类误差平方和（SSE）列表
# sse = []
# # 设置聚类数目的范围
# k_values = range(1, 10)
# # 遍历不同的聚类数目
# for k in k_values:
#
#     # 创建KMeans聚类模型
#     kmeans = KMeans(n_clusters=k, random_state=0)
#     # 将数据转换为特征矩阵
#     # X = pd.concat(data, axis=1)
#     # 进行聚类
#     kmeans.fit(X)
#     # 计算聚类误差平方和
#     sse.append(kmeans.inertia_)
#
# # 绘制SSE与聚类数目的关系图
# plt.plot(k_values, sse, 'bx-')
# plt.xlabel('Number of Clusters')
# plt.ylabel('SSE')
# plt.title('Elbow Method')
# plt.show()

# 执行聚类分析
kmeans = KMeans(n_clusters=3)  # 指定聚类数目
kmeans.fit(X)
# print(X)

# # 获取聚类结果
# labels = kmeans.labels_
# # print(labels)
#
# # 输出每个CSV文件所属的聚类类别
# for i, filename in enumerate(os.listdir(csv_folder)):
#     if filename.endswith(".csv"):
#         # 提取CSV文件名作为metric名称
#         metric_name = os.path.splitext(filename)[0]
#
#         # 获取对应的聚类类别
#         cluster_label = labels[i]
#
#         print(f"Metric: {metric_name}, Cluster: {cluster_label}")







